<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Excel数据导出测试</title>
    <style>
        body {
            font-family: 'Microsoft YaHei', Arial, sans-serif;
            margin: 0;
            padding: 20px;
            color: #333;
            background-color: #f5f5f5;
        }
        .container {
            max-width: 900px;
            margin: 0 auto;
            background-color: #fff;
            padding: 30px;
            border-radius: 5px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
        }
        h1 {
            text-align: center;
            color: #2c3e50;
            margin-bottom: 30px;
        }
        .tabs {
            display: flex;
            margin-bottom: 20px;
            border-bottom: 1px solid #ddd;
        }
        .tab {
            padding: 10px 20px;
            cursor: pointer;
            background-color: #f8f8f8;
            border: 1px solid #ddd;
            border-bottom: none;
            border-radius: 5px 5px 0 0;
            margin-right: 5px;
        }
        .tab.active {
            background-color: #fff;
            border-bottom: 1px solid #fff;
            margin-bottom: -1px;
            font-weight: bold;
        }
        .tab-content {
            display: none;
        }
        .tab-content.active {
            display: block;
        }
        .form-group {
            margin-bottom: 15px;
        }
        label {
            display: block;
            margin-bottom: 5px;
            font-weight: bold;
        }
        input[type="text"],
        select,
        textarea {
            width: 100%;
            padding: 8px;
            border: 1px solid #ddd;
            border-radius: 4px;
            box-sizing: border-box;
        }
        .btn {
            background-color: #3498db;
            color: white;
            border: none;
            padding: 10px 15px;
            border-radius: 4px;
            cursor: pointer;
            font-size: 16px;
            transition: background-color 0.3s;
        }
        .btn:hover {
            background-color: #2980b9;
        }
        .btn-secondary {
            background-color: #95a5a6;
        }
        .btn-secondary:hover {
            background-color: #7f8c8d;
        }
        .actions {
            margin-top: 30px;
            text-align: center;
        }
        .loading {
            display: none;
            text-align: center;
            margin-top: 20px;
        }
        .loading-spinner {
            display: inline-block;
            width: 30px;
            height: 30px;
            border: 3px solid rgba(0, 0, 0, 0.1);
            border-radius: 50%;
            border-top-color: #3498db;
            animation: spin 1s ease-in-out infinite;
        }
        @keyframes spin {
            to { transform: rotate(360deg); }
        }
        .result {
            display: none;
            margin-top: 20px;
            padding: 15px;
            border-radius: 4px;
        }
        .success {
            background-color: #d4edda;
            color: #155724;
        }
        .error {
            background-color: #f8d7da;
            color: #721c24;
        }
        .back-link {
            display: inline-block;
            margin-top: 30px;
            color: #3498db;
            text-decoration: none;
        }
        .back-link:hover {
            text-decoration: underline;
        }
        .progress-container {
            display: none;
            margin-top: 20px;
        }
        .progress-bar {
            width: 100%;
            background-color: #e9ecef;
            border-radius: 4px;
            height: 20px;
            overflow: hidden;
        }
        .progress {
            width: 0%;
            height: 100%;
            background-color: #3498db;
            transition: width 0.3s;
        }
        .progress-text {
            text-align: center;
            margin-top: 5px;
            font-size: 14px;
        }
        .download-links {
            display: none;
            margin-top: 20px;
            padding: 15px;
            background-color: #e7f4ff;
            border-radius: 4px;
        }
        .download-link {
            display: block;
            margin: 10px 0;
            color: #3498db;
            text-decoration: none;
        }
        .download-link:hover {
            text-decoration: underline;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Excel 数据导出测试</h1>
        
        <div class="tabs">
            <div class="tab active" data-tab="standard">标准导出</div>
            <div class="tab" data-tab="smart">智能导出</div>
        </div>
        
        <div class="tab-content active" id="standard-tab">
            <h2>标准 Excel 导出</h2>
            <p>选择业务类型并设置导出参数，生成Excel文件并直接下载。</p>
            
            <div class="form-group">
                <label for="business-type">业务类型</label>
                <select id="business-type">
                    <option value="INVOICE">发票数据</option>
                    <option value="CUST_CREDIT">客户授信</option>
                    <option value="CUST_PAYMENT_PLAN">客户付款计划</option>
                    <option value="CUST_PAYMENT_RESULT">客户付款结果</option>
                </select>
            </div>
            
            <div class="form-group">
                <label for="headers-json">自定义表头 (JSON格式，可选)</label>
                <textarea id="headers-json" rows="4" placeholder='例如: {"invoiceId":"单据编号","invoiceNo":"发票号码"}&#10;留空表示使用默认表头'></textarea>
            </div>
            
            <div class="form-group">
                <label for="params-json">导出参数 (JSON格式，可选)</label>
                <textarea id="params-json" rows="4" placeholder='例如: {"customerName":"测试客户","startDate":"2023-01-01"}&#10;留空表示导出所有数据'></textarea>
            </div>
            
            <div class="actions">
                <button id="export-btn" class="btn">导出Excel文件</button>
            </div>
        </div>
        
        <div class="tab-content" id="smart-tab">
            <h2>智能 Excel 导出</h2>
            <p>根据数据量自动选择导出模式，支持大数据量分块导出。</p>
            
            <div class="form-group">
                <label for="smart-business-type">业务类型</label>
                <select id="smart-business-type">
                    <option value="INVOICE">发票数据</option>
                    <option value="CUST_CREDIT">客户授信</option>
                    <option value="CUST_PAYMENT_PLAN">客户付款计划</option>
                    <option value="CUST_PAYMENT_RESULT">客户付款结果</option>
                </select>
            </div>
            
            <div class="form-group">
                <label for="filename">文件名 (不含扩展名)</label>
                <input type="text" id="filename" placeholder="导出文件名" value="导出数据">
            </div>
            
            <div class="form-group">
                <label for="smart-headers-json">自定义表头 (JSON格式，可选)</label>
                <textarea id="smart-headers-json" rows="4" placeholder='例如: {"invoiceId":"单据编号","invoiceNo":"发票号码"}&#10;留空表示使用默认表头'></textarea>
            </div>
            
            <div class="form-group">
                <label for="smart-params-json">导出参数 (JSON格式，可选)</label>
                <textarea id="smart-params-json" rows="4" placeholder='例如: {"customerName":"测试客户","startDate":"2023-01-01"}&#10;留空表示导出所有数据'></textarea>
            </div>
            
            <div class="form-group">
                <div style="margin-top: 8px;">
                    <input type="checkbox" id="enablePackage" checked>
                    <label for="enablePackage">当输出多个文件时自动打包下载 (ZIP格式)</label>
                </div>
            </div>
            
            <div class="actions">
                <button id="smart-export-btn" class="btn">智能导出Excel</button>
            </div>
            
            <div class="progress-container">
                <div class="progress-bar">
                    <div class="progress"></div>
                </div>
                <div class="progress-text">准备导出...</div>
            </div>
            
            <div class="download-links"></div>
        </div>
        
        <div class="loading">
            <div class="loading-spinner"></div>
            <p>正在处理导出请求，请稍候...</p>
        </div>
        
        <div class="result" id="result-box"></div>
        
        <div style="text-align: center;">
            <a href="excel-export-guide.html" class="btn btn-secondary">查看使用指南</a>
            <a href="index.html" class="back-link">返回主页</a>
        </div>
    </div>
    
    <script>
        // 切换标签页
        document.querySelectorAll('.tab').forEach(tab => {
            tab.addEventListener('click', () => {
                // 移除所有标签页和内容的active类
                document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
                document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
                
                // 添加active类到当前标签页和对应内容
                tab.classList.add('active');
                document.getElementById(tab.getAttribute('data-tab') + '-tab').classList.add('active');
            });
        });
        
        // 全局变量存储导出状态
        let exportState = null;
        
        // 标准导出
        document.getElementById('export-btn').addEventListener('click', function() {
            const businessType = document.getElementById('business-type').value;
            const headersStr = document.getElementById('headers-json').value.trim();
            const paramsStr = document.getElementById('params-json').value.trim();
            
            // 解析JSON或使用空对象
            let headers = {};
            let params = {};
            
            try {
                if (headersStr) {
                    headers = JSON.parse(headersStr);
                }
                if (paramsStr) {
                    params = JSON.parse(paramsStr);
                }
            } catch (e) {
                showResult('JSON格式错误: ' + e.message, false);
                return;
            }
            
            // 构建请求体
            const requestBody = {
                businessType: businessType,
                headers: headers,
                exportParams: params
            };
            
            showLoading(true);
            
            // 发起导出请求，使用directExport函数
            directExport(businessType, headers, params);
        });

        // 智能导出
        document.getElementById('smart-export-btn').addEventListener('click', function() {
            const businessType = document.getElementById('smart-business-type').value;
            const fileName = document.getElementById('filename').value || '导出数据';
            const headersStr = document.getElementById('smart-headers-json').value.trim();
            const paramsStr = document.getElementById('smart-params-json').value.trim();

            // 解析JSON或使用空对象
            let headers = {};
            let params = {};

            try {
                if (headersStr) {
                    headers = JSON.parse(headersStr);
                }
                if (paramsStr) {
                    params = JSON.parse(paramsStr);
                }
            } catch (e) {
                showResult('JSON格式错误: ' + e.message, false);
                return;
            }

            showLoading(true);
            document.querySelector('.progress-container').style.display = 'block';
            document.querySelector('.download-links').style.display = 'none';
            document.querySelector('.download-links').innerHTML = '';

            // 重置进度条
            updateProgress(0, '准备导出...');

            // 使用smartExport函数
            smartExport(businessType, fileName, headers, params);
        });

        // 直接导出模式
        async function directExport(businessType, headers, params) {
            try {
                showInfo('正在准备导出数据...');

                const response = await fetch('/common/exportExcel', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({
                        businessType: businessType,
                        exportParams: params,
                        headers: headers
                    })
                });

                if (!response.ok) {
                    throw new Error('网络请求失败，状态码: ' + response.status);
                }

                // 检查内容类型
                const contentType = response.headers.get('content-type');

                // 处理二进制Excel文件响应
                if (contentType && (
                    contentType.includes('application/vnd.ms-excel') ||
                    contentType.includes('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') ||
                    contentType.includes('application/octet-stream'))) {

                    const arrayBuffer = await response.arrayBuffer();
                    const blob = new Blob([arrayBuffer], { type: contentType });

                    // 下载文件
                    const url = URL.createObjectURL(blob);
                    const a = document.createElement('a');
                    a.href = url;
                    a.download = `${businessType}_导出数据.xlsx`;
                    document.body.appendChild(a);
                    a.click();

                    // 清理
                    setTimeout(() => {
                        document.body.removeChild(a);
                        URL.revokeObjectURL(url);
                    }, 100);

                    showLoading(false);
                    showResult('导出成功！', true);
                    return;
                }

                // 如果不是直接的二进制响应，尝试处理其他类型的响应
                const responseText = await response.text();

                // 检查是否是JSON响应
                try {
                    const result = JSON.parse(responseText);

                    if (result.code === 200 || result.code === 0) {
                        // 如果成功但没有二进制数据，可能是其他成功信息
                        showLoading(false);
                        showResult('导出成功！', true);
                    } else {
                        // 服务器返回错误
                        showLoading(false);
                        showResult('导出失败: ' + (result.msg || '未知错误'), false);
                    }
                } catch (e) {
                    // 不是JSON，可能是其他格式的响应
                    console.error('响应格式解析失败:', e);
                    showLoading(false);
                    showResult('导出失败: 无法解析服务器响应', false);
                }
            } catch (error) {
                console.error('导出请求失败:', error);
                showLoading(false);
                showResult('导出失败: ' + error.message, false);
            }
        }

        // 智能导出模式 - 重构版，基于index_test.html
        async function smartExport(businessType, fileName, headers, params) {
            try {
                // 获取是否需要打包下载
                const enablePackage = document.getElementById('enablePackage').checked;

                // 构建请求体
                const requestBody = {
                    businessType: businessType,
                    fileName: fileName,
                    headers: headers,
                    exportParams: {
                        ...params,
                        enablePackage: enablePackage
                    }
                };

                console.log('发送智能导出请求:', businessType, fileName);

                // 发起智能导出请求
                const response = await fetch('/common/smartExportExcel', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(requestBody)
                });

                if (!response.ok) {
                    throw new Error('网络请求失败，状态码: ' + response.status);
                }

                // 检查内容类型 - 如果是直接下载的Excel文件或ZIP文件
                const contentType = response.headers.get('content-type');
                console.log('服务器返回内容类型:', contentType);
                
                // 直接二进制下载处理
                if (contentType && (
                    contentType.includes('application/vnd.ms-excel') ||
                    contentType.includes('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') ||
                    contentType.includes('application/zip') ||
                    contentType.includes('application/octet-stream'))) {
                    
                    const arrayBuffer = await response.arrayBuffer();
                    
                    // 确定正确的文件扩展名和MIME类型
                    let fileExt = '.xlsx';
                    let mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
                    
                    // 检查文件头部特征来确定文件类型 (ZIP文件头部以PK\x03\x04开头)
                    const headerBytes = new Uint8Array(arrayBuffer.slice(0, 4));
                    const isZip = headerBytes[0] === 0x50 && headerBytes[1] === 0x4B && 
                                  headerBytes[2] === 0x03 && headerBytes[3] === 0x04;
                    
                    // 检查内容类型是否包含zip
                    const isZipContentType = contentType.includes('application/zip');
                    
                    console.log('文件头部检查:', isZip ? 'ZIP文件' : 'Excel文件');
                    console.log('内容类型检查:', isZipContentType ? 'ZIP类型' : '其他类型');
                    
                    // 从响应头获取文件名和类型信息
                    const contentDisposition = response.headers.get('content-disposition');
                    let isZipFilename = false;
                    
                    if (contentDisposition) {
                        const filenameMatch = contentDisposition.match(/filename=["']?([^"']+)["']?/);
                        if (filenameMatch && filenameMatch[1]) {
                            isZipFilename = filenameMatch[1].toLowerCase().endsWith('.zip');
                            console.log('响应头文件名:', filenameMatch[1], isZipFilename ? '(ZIP文件)' : '');
                        }
                    }
                    
                    // 如果是ZIP文件，更改扩展名和MIME类型
                    if (isZip || isZipContentType || isZipFilename) {
                        fileExt = '.zip';
                        mimeType = 'application/zip';
                        console.log('检测到ZIP文件，使用.zip扩展名');
                    }
                    
                    // 构建文件名 (如果当前已经有扩展名，先移除再添加正确的扩展名)
                    let downloadFileName = fileName;
                    // 移除所有可能的扩展名
                    downloadFileName = downloadFileName.replace(/\.(xlsx|xls|zip)$/i, '');
                    // 添加正确的扩展名
                    downloadFileName = downloadFileName + fileExt;
                    
                    console.log('最终文件名:', downloadFileName, '文件类型:', mimeType);

                    // 创建Blob并下载
                    const blob = new Blob([arrayBuffer], { type: mimeType });
                    const url = URL.createObjectURL(blob);
                    const a = document.createElement('a');
                    a.href = url;
                    a.download = downloadFileName;
                    document.body.appendChild(a);
                    a.click();

                    // 清理
                    setTimeout(() => {
                        document.body.removeChild(a);
                        URL.revokeObjectURL(url);
                    }, 100);

                    showLoading(false);
                    updateProgress(100, '导出完成！');
                    showResult('导出成功！', true);
                    return;
                }

                // 处理JSON响应（大数据量、多文件导出情况）
                const result = await response.json();
                console.log('服务器返回数据:', result);

                if (result.code !== 200 && result.code !== 0 && result.code !== "0" && result.code !== "200") {
                    throw new Error(result.msg || '导出失败');
                }

                const data = result.data;

                // 防止未定义的data导致后面的代码出错
                if (!data) {
                    showLoading(false);
                    updateProgress(100, '导出完成！');
                    showResult('导出完成，但未返回数据内容', true);
                    return;
                }

                console.log('智能导出数据:', data);
                console.log('是否多文件:', data.isMultiFileExport, '文件索引:', data.fileIndex, '总文件数:', data.totalFiles);

                // 检查是否有打包下载URL，并且是多文件导出情况
                if (data.packageAvailable && data.packageUrl && data.isMultiFileExport && data.totalFiles > 1) {
                    showLoading(false);
                    showInfo(`数据量较大，已为您准备了ZIP打包下载 (包含${data.totalFiles || '多个'}个Excel文件)`);

                    // 直接下载ZIP包
                    const a = document.createElement('a');
                    a.href = data.packageUrl;
                    a.download = `${fileName}.zip`;
                    document.body.appendChild(a);
                    a.click();
                    document.body.removeChild(a);

                    updateProgress(100, '打包下载已准备完成');
                    return;
                }

                // 处理文件内容 - 单文件导出情况
                if (data.fileContent) {
                    showLoading(false);
                    let blob;
                    
                    // 判断单文件导出还是多文件打包
                    const isSingleFile = !data.isMultiFileExport || (data.isMultiFileExport && data.totalFiles === 1);
                    console.log('单文件导出判断:', isSingleFile ? '是单文件' : '是多文件');
                    
                    // 处理不同格式的文件内容
                    if (typeof data.fileContent === 'string' && isBase64Like(data.fileContent)) {
                        // 解码Base64数据
                        const byteString = atob(cleanAndFixBase64(data.fileContent));
                        const ab = new ArrayBuffer(byteString.length);
                        const ia = new Uint8Array(ab);
                        for (let i = 0; i < byteString.length; i++) {
                            ia[i] = byteString.charCodeAt(i);
                        }
                        
                        // 检查前4个字节是否是ZIP文件头
                        const isZipContent = ia.length >= 4 && 
                                          ia[0] === 0x50 && ia[1] === 0x4B && 
                                          ia[2] === 0x03 && ia[3] === 0x04;
                        
                        // 单文件导出不应该打包，强制使用Excel MIME类型
                        const mimeType = isSingleFile && !isZipContent ? 
                                      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' : 
                                      (isZipContent ? 'application/zip' : 
                                       'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
                        
                        blob = new Blob([ab], { type: mimeType });
                        console.log('Base64数据检查:', isZipContent ? 'ZIP内容' : 'Excel内容');
                    } else if (Array.isArray(data.fileContent)) {
                        const uint8Array = new Uint8Array(data.fileContent);
                        // 检查前4个字节是否是ZIP文件头
                        const isZipContent = uint8Array.length >= 4 && 
                                          uint8Array[0] === 0x50 && uint8Array[1] === 0x4B && 
                                          uint8Array[2] === 0x03 && uint8Array[3] === 0x04;
                        
                        // 单文件导出不应该打包，强制使用Excel MIME类型
                        const mimeType = isSingleFile && !isZipContent ? 
                                      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' : 
                                      (isZipContent ? 'application/zip' : 
                                       'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
                        
                        blob = new Blob([uint8Array], { type: mimeType });
                        console.log('数组数据检查:', isZipContent ? 'ZIP内容' : 'Excel内容');
                    } else if (typeof data.fileContent === 'object') {
                        // 处理对象格式的二进制数据
                        try {
                            const byteArray = Object.values(data.fileContent);
                            const uint8Array = new Uint8Array(byteArray);
                            
                            // 检查前4个字节是否是ZIP文件头
                            const isZipContent = uint8Array.length >= 4 && 
                                              uint8Array[0] === 0x50 && uint8Array[1] === 0x4B && 
                                              uint8Array[2] === 0x03 && uint8Array[3] === 0x04;
                            
                            // 单文件导出不应该打包，强制使用Excel MIME类型
                            const mimeType = isSingleFile && !isZipContent ? 
                                          'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' : 
                                          (isZipContent ? 'application/zip' : 
                                           'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
                            
                            blob = new Blob([uint8Array], { type: mimeType });
                            console.log('对象数据检查:', isZipContent ? 'ZIP内容' : 'Excel内容');
                        } catch (e) {
                            console.error('无法处理文件内容对象:', e);
                            throw new Error('无法解析文件内容');
                        }
                    } else {
                        throw new Error('未知的文件内容格式');
                    }

                    // 确定正确的文件扩展名 - 根据是否为单文件导出判断
                    let fileExtension = '.xlsx';
                    let fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
                    
                    // 检查是否应该使用ZIP格式 - 多文件导出才可能为ZIP
                    const shouldBeZip = (!isSingleFile && blob.type === 'application/zip') || 
                                      (!isSingleFile && data.fileType && data.fileType.toLowerCase() === 'zip');
                    
                    if (shouldBeZip) {
                        fileExtension = '.zip';
                        fileType = 'application/zip';
                        console.log('多文件导出，使用ZIP格式');
                    } else {
                        // 单文件导出，即使文件头是ZIP格式也使用Excel扩展名
                        if (isSingleFile) {
                            fileExtension = '.xlsx';
                            fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
                            console.log('单文件导出，强制使用Excel格式');
                        }
                    }
                    
                    // 如果有fileName属性且带有扩展名，尊重服务器指定的格式
                    let finalFileName = fileName;
                    if (data.fileName) {
                        const serverFileName = data.fileName;
                        console.log('服务器返回的文件名:', serverFileName);
                        
                        // 如果服务器明确指定了文件类型，则仅在多文件情况下接受ZIP
                        if (serverFileName.toLowerCase().endsWith('.zip') && !isSingleFile) {
                            fileExtension = '.zip';
                            fileType = 'application/zip';
                            console.log('通过服务器返回的文件名检测到ZIP文件:', serverFileName);
                        } else if (serverFileName.toLowerCase().endsWith('.xlsx') || 
                                  serverFileName.toLowerCase().endsWith('.xls')) {
                            fileExtension = serverFileName.substr(serverFileName.lastIndexOf('.'));
                            fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
                        }
                    }
                    
                    // 移除可能存在的旧扩展名
                    finalFileName = finalFileName.replace(/\.(xlsx|xls|zip)$/i, '');
                    // 添加正确的扩展名
                    finalFileName = finalFileName + fileExtension;
                    
                    console.log('最终下载文件名:', finalFileName, '文件类型:', fileType);
                    
                    // 重新创建blob使用正确的文件类型
                    blob = new Blob([blob], { type: fileType });
                    
                    const url = window.URL.createObjectURL(blob);
                    const a = document.createElement('a');
                    a.href = url;
                    a.download = finalFileName;
                    document.body.appendChild(a);
                    a.click();
                    document.body.removeChild(a);
                    window.URL.revokeObjectURL(url);

                    updateProgress(100, '导出完成！');
                    showResult('导出成功！', true);
                } else if (data.isMultiFileExport && data.totalFiles > 1) {
                    // 处理多文件导出情况
                    showLoading(false);
                    
                    // 显示下载链接区域
                    const downloadLinks = document.querySelector('.download-links');
                    downloadLinks.style.display = 'block';
                    
                    // 提示用户多文件导出信息
                    downloadLinks.innerHTML = `<p>总共 ${data.totalFiles} 个文件，已生成第 ${data.fileIndex || 1} 个，请刷新页面继续导出下一个文件。</p>`;
                    
                    // 如果有当前文件，处理下载
                    if (data.fileName) {
                        const currentFile = data.fileName;
                        const fileUrl = data.fileUrl;
                        if (fileUrl) {
                            const linkHtml = `<a href="${fileUrl}" download="${currentFile}" class="download-link">下载文件: ${currentFile}</a>`;
                            downloadLinks.innerHTML += linkHtml;
                        }
                    }
                    
                    // 更新进度
                    const progress = Math.round(((data.fileIndex || 1) / data.totalFiles) * 100);
                    updateProgress(progress, '多文件导出中...');
                } else {
                    // 其他情况，可能是没有文件内容的成功响应
                    showLoading(false);
                    updateProgress(100, '导出完成！');
                    showResult(result.msg || '导出成功！', true);
                }

            } catch (error) {
                console.error('智能导出失败:', error);
                showLoading(false);
                updateProgress(0, '导出失败');
                showResult('导出失败: ' + error.message, false);
            }
        }

        // 清理并修复Base64字符串
        function cleanAndFixBase64(content) {
            if (!content) return content;

            // 移除所有空白字符
            let cleaned = content.replace(/\s/g, '');

            // 确保长度是4的倍数
            const remainder = cleaned.length % 4;
            if (remainder > 0) {
                cleaned += '='.repeat(4 - remainder);
            }

            return cleaned;
        }

        // 检查字符串是否是Base64编码
        function isBase64Like(str) {
            if (!str || typeof str !== 'string') return false;

            // 移除可能的空白字符
            const trim = str.trim();

            // 应该只包含Base64字符
            const base64Pattern = /^[A-Za-z0-9+/]*={0,2}$/;

            // 长度应该是4的倍数
            return base64Pattern.test(trim) || (trim.length % 4 <= 2);
        }

        // 更新进度条
        function updateProgress(percent, text) {
            document.querySelector('.progress').style.width = percent + '%';
            document.querySelector('.progress-text').textContent = text;
        }

        // 辅助函数
        function showLoading(show) {
            document.querySelector('.loading').style.display = show ? 'block' : 'none';
        }

        function showResult(message, isSuccess) {
            const resultBox = document.getElementById('result-box');
            resultBox.textContent = message;
            resultBox.style.display = 'block';
            resultBox.className = 'result ' + (isSuccess ? 'success' : 'error');

            // 5秒后自动隐藏结果
            setTimeout(() => {
                resultBox.style.display = 'none';
            }, 5000);
        }

        // 显示信息提示
        function showInfo(message) {
            showResult(message, true);
        }
    </script>
</body>
</html> 